package com.lmx.persistence.service.common;

import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.springframework.data.domain.Page;

import com.lmx.persistence.IOperations;
import com.lmx.repoDomain.tmodel.BaseDataEntity;
import com.lmx.repoDomain.tmodel.unpersis.QueryParam;

/**
 * 补充部分基础CRUD方法接口
 *
 * @author ytche
 * @date 2017年6月9日
 *
 */
public interface BaseCrudService<T extends BaseDataEntity> extends
		IOperations<T> {
	public T save(T entity);

	public T findOne(Map<String, Object> param);

	public T findOne(String fieldName, Object value);

	public T findOneNotDelete(String fieldName, Object value);

	public List<T> find(Map<String, Object> param);

	public List<T> find(String fieldName, Object value);

	public List<T> findNotDelete(String fieldName, Object value);

	public List<T> findByIds(Long... ids);

	/**
	 * 根据条件获取数据总数
	 *
	 * @author ytche
	 * @param param
	 * @return
	 * @date 2017年6月13日 下午5:47:55
	 */
	public Integer getCount(Map<String, Object> param);

	/**
	 * 分页方法
	 *
	 * @author ytche
	 * @param sql
	 *            查询数据sql
	 * @param countSql
	 *            查询总数sql
	 * @param pageParam
	 *            分页相关参数
	 * @param valueMap
	 *            sql查询的字段以及对应的字段值
	 * @return
	 * @date 2017年6月12日 下午6:45:52
	 */
	public Page<T> pageBySql(String sql, String countSql, QueryParam pageParam,
			Map<String, Object> valueMap);

	/**
	 * 分页方法
	 *
	 * @author ytche
	 * @param hql
	 *            查询数据hql
	 * @param countHql
	 *            查询总数hql
	 * @param queryParam
	 *            分页相关参数
	 * @param valueMap
	 *            hql查询的字段以及对应的字段值
	 * @return
	 * @date 2017年6月16日 下午4:36:08
	 */
	public Page<T> pageByHql(String hql, String countHql,
			QueryParam queryParam, Map<String, Object> valueMap);

	public Page<T> pageBySqlOfHibernate(String sql, String countSql,
			QueryParam pageParam, Map<String, Object> valueMap);

	/**
	 * 基于hibernate Query的分页方法
	 *
	 * @author ytche
	 * @param dataQuery
	 * @param countQuery
	 * @param pageParam
	 * @return
	 * @date 2017年9月1日 下午6:47:48
	 */
	Page<T> pageByQuery(Query dataQuery, Query countQuery, QueryParam pageParam);
}
